#ifndef SORTER_H
#define SORTER_H

#include <cstddef> //Para usar "size_t".
#include <cstring> //Para usar "memcpy".
#include <ctime>   //Para usar "clock".
#include <iostream>
using namespace std;

typedef unsigned char byte;

class Sorter
{
    protected:
        /// Atributos ///
        void* vetor;
        size_t tamanho_vetor;
        size_t tamanho_elemento;
        int(*funcao_comparacao)(const void*,const void*);
        clock_t tempo_inicial;

        /// Métodos privados: ///
        // Retorna a referencia de um elemento:
        void* get(size_t posicao);                                   ///ok!!!
        // Trocar dois elementos de posição:
        void trocar(size_t primeiro, size_t segundo);                ///ok!!!
        // Inicializar o cronômetro:
        void tempo_iniciar();                                        ///ok!!!
        // Parar o cronômetro e retorna o tempo em milisegundos:
        double tempo_terminar();                                     ///ok!!!
        // Trocar dois elementos do vetor:

    public:
        Sorter(void* v,
               size_t n,// Tamanho do vetor "v".
               size_t t,// Tamanho do elemento.
               int(*comparador)(const void*,const void*)
               );                                                    ///ok!!!
        virtual ~Sorter(){};                                         ///ok!!!
        // Função que ordena do modo especifico de cada tipo de algoritmo ordenação:
        virtual double ordenar()=0;                                  /// Implementação na classe derivada.
};

#endif // SORTER_H
